package Z007InterfaceAndExtends.O02DuiXaingZhuanXing;

import sun.applet.Main;

/**
 * 所谓的转型，是指当引用类型和对象类型不一致的时候，才需要进行类型转换
 * 类型转换有时候会成功，有时候会失败(参考基本类型的类型转换)
 *
 * 到底能否转换成功？ 教大家一个很简单的判别办法
 * 把右边的当做左边来用，看说得通不
 *
 */
public class Hero {
    public String name ;
    protected float hp ;
    float armor ;
    int moveSpeed;

    public static void main(String[] args) {
        ADHero Son = new ADHero();
        Hero Father = new Hero();
        Father = Son;
        // 子类转化为父类一定成功！

        //  类型转换指的是把一个引用所指向的对象的类型，
        //  转换为另一个引用的类型
        //  把ad引用所指向的对象的类型是ADHero
        //  h引用的类型是Hero
        //  把ADHero当做Hero使用，一定可以

        Support Son1 = new Support();
        Son = (ADHero) Father ;
        // 父类转化为子类（强制转换）
        Father = Son1 ;
        // 子类转化为父类
        Son = (ADHero) Father;
        // 父类转子类。失败

        /**
         * 引用到底指向那种对象！！！！
         */

    }
}

class Hero1{  //  没有继承的两个类，互相转化
    public static void main(String[] args) {
        ADHero ad = new ADHero();
        APHero ap = new APHero();

        //  ad = (ADHero) ap;
        //  没有继承关系的类型进行互相转换一定会失败，所以会出现编译错误
    }
}


class Hero2{
    public static void main(String[] args) {
        ADHero ad = new ADHero();
        AD adi = ad;
        // 实现类转换成接口(向上转型)
        AD af = new ADHero();
        // AD 接口类型
    }

}

class Hero3{

    // 接口转换成实现类(向下转型)

    ADHero ad = new ADHero();
    AD adi = ad;
    ADHero adHero = (ADHero) adi;
    APADHero adapHero = (APADHero) adi;

    // 失败 所指向的实际类型 是 AD hero
    // 假设能够转换成功，
    // 那么就可以使用magicAttack方法，
    // 而adi引用所指向的对象ADHero是没有magicAttack方法的。

}

class Hero4{

    public static void main(String[] args) {

    ADHero ad = new ADHero();
    APHero ap = new APHero();

    Hero h1 = ad;
    Hero h2 = ap;

        System.out.println(h1 instanceof ADHero);
        System.out.println(h2 instanceof ADHero);
    }
}

// 练习
/**
 * 如下转换能否成功？
 * 如果不能，是哪一行会出错？
 * 为什么会出错
 *
 * package charactor;
 *
 * public class Hero {
 *     public String name;
 *     protected float hp;
 *
 *     public static void main(String[] args) {
 *         ADHero ad = new ADHero();
 *         Hero h = ad;
 *         AD adi = (AD) h;
 *         APHero ap = (APHero) adi;
 *     }
 * }
 */